// Node.js EventEmitter
// events模块只提供了一个对象：events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。
let events = require('events');

let eventEmitter = new events.EventEmitter();

eventEmitter.on('some_event', function () {
   console.log('some_event事件触发！！')
});

setTimeout(function () {
    eventEmitter.emit('some_event');
}, 500);

/* EventEmitter 的每个事件由一个事件名和若干个参数组成,
当事件触发时，注册到这个事件的事件监听器被依次调用，事件参数作为回调函数参数传递。
 */
eventEmitter.on('some', function (arr, arr2) {
    console.log('eventONE!' , arr , arr2)
});

eventEmitter.on('some', function (arr, arr2) {
    console.log('eventTWO!' , arr , arr2)
});

eventEmitter.emit('some', 'arg111111', 'arg222222')


// EventEmitter 提供了多个属性，如 on、emit、addListener

let listen1 = function () {
  console.log('监听器1111')
};

let listen2 = function () {
    console.log('监听器2222222')
};

// 绑定 connection 事件，处理函数为 listener1
eventEmitter.on('connection', listen1);

// 绑定 connection 事件，处理函数为 listener2
eventEmitter.addListener('connection', listen2);

// 监听事件个数记录
let count = eventEmitter.listenerCount('connection');
console.log(`一共${count}个connection事件`)


// 移除监绑定的 listener1 函数
eventEmitter.removeListener('connection', listen1)
console.log("listener1 不再受监听。");


// 触发监听事件
eventEmitter.emit('connection');
count = eventEmitter.listenerCount('connection');
console.log(`还剩${count}个connection事件`)


console.log("程序执行完毕。");

/*1、eventEmitter.on()与eventEmitter.addListener()没有区别，且一个事件可以绑定多个回调函数；
2、若事件队列中出现一个未绑定事件则触发error事件，若未绑定 error事件则程序抛出异常结束执行 */
